package serviceWeb;

import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.restlet.data.CharacterSet;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.ext.xml.DomRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.Get;
import org.restlet.resource.Post;
import org.restlet.resource.ServerResource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

/**
 * Ressource permettant de renvoyer l'ensemble des enregistrements d'une table
 * ou de créer un nouvel enregistrement pour cette table
 */
public class TableRecordsResource extends ServerResource {

  EchangeBDXML table;

  String nomBD;
  String nomTable;

  /** Representation retournée */
  Representation resultat;
  /** Erreurs possibles */
  List<String> erreurs;

  /** Initialisation de la ressource a partir de la chaine d'url
   */
  protected void init() {

    nomBD = getRequest().getAttributes().get("nomBD").toString();
    nomTable = getRequest().getAttributes().get("nomTable").toString();

   
    table = new serviceWeb.modelePostgreSQL.EchangeBDXML();

  }

  /** Représentation XML (en UTF8) en réponse à une requête GET.
   * <br/>
   * Retour possible : 200, 401 avec idNotInteger, 404, 500 (si
   * problème avec la BD)
   */
  @Get
  public Representation doGet() {
    init();
    if (getStatus() == Status.SUCCESS_OK) {

      assert table.getXML() != null;
      try
      {
        DomRepresentation dom = new DomRepresentation(MediaType.TEXT_XML);

        table.getTousLesRecords(nomBD, nomTable);

        InputStream binaryStream = table.getXML().getBinaryStream();

        DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = parser.parse(binaryStream);

        FonctionsServerResource.ajouterContraintes(doc, table, nomBD, nomTable);
        
        dom.setDocument(doc);

        // Encodage en UTF-8
        dom.setCharacterSet(CharacterSet.UTF_8);
        resultat = dom;
      }
      catch (IOException exc) {
        setStatus(Status.SERVER_ERROR_INTERNAL);
        exc.printStackTrace();
      }
      catch (SQLException exc) {
          setStatus(Status.SERVER_ERROR_INTERNAL);
          //resultat = new StringRepresentation(exc.getMessage());
          resultat = new StringRepresentation(exc.getCause().getMessage());
          exc.printStackTrace();
      }
      catch (ParserConfigurationException exc) {
          setStatus(Status.SERVER_ERROR_INTERNAL);
          resultat = new StringRepresentation(exc.getMessage());
          exc.printStackTrace();
      }
      catch (SAXException exc) {
          setStatus(Status.SERVER_ERROR_INTERNAL);
          resultat = new StringRepresentation(exc.getMessage());
          exc.printStackTrace();
      }
    }
    return resultat;
  }

  /**
   * Nouvel enregistrement
   */
  @Post
  public Representation doPost(Representation entity)
  {
      init();
      
      EchangeBDXML newRecord = new serviceWeb.modelePostgreSQL.EchangeBDXML();

      DomRepresentation dom = new DomRepresentation(entity);

      try
      {
          //Récupération de l'XML reçu du client web
          Document doc = dom.getDocument();
          Element table = doc.getDocumentElement();
          Node row = table.getFirstChild();

          //Création de la requête
          String requete = "Insert into " + table.getNodeName() + "(";

          for(int i = 0 ; i < row.getChildNodes().getLength() ; i++)
          {
              if(i != 0) requete += ", ";
              String nomColonne = row.getChildNodes().item(i).getNodeName();
              requete += nomColonne;
            
          }

          requete += ") values(";

          for(int i = 0 ; i < row.getChildNodes().getLength() ; i++)
          {
              if(i != 0) requete += ", ";
              Node contenuColonne = row.getChildNodes().item(i).getFirstChild();
              requete += "'";
              if(contenuColonne != null)
                  requete += contenuColonne.getTextContent();
              requete += "'";

          }

          requete += ");";

          newRecord.postRecord(nomBD, requete);
          resultat = entity;
      }
      catch(IOException e)
      {
          setStatus(Status.SERVER_ERROR_INTERNAL);
          resultat = new StringRepresentation(e.getMessage());
          e.printStackTrace();
      }
      catch(SQLException e)
      {
          setStatus(Status.SERVER_ERROR_INTERNAL);
          resultat = new StringRepresentation(e.getMessage());
          e.printStackTrace();
      }
      return resultat;

  }
  
}
